package com.rv.nats.resolver.param;

import java.lang.reflect.Parameter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author sundez
 * @version 1.1.4.8
 * @since 2025/6/12
 *   参数解析器工厂
 *   用于创建参数解析器
 *   该工厂会根据参数的类型和注解创建对应的参数解析器
 *   例如：如果参数类型为String，并且带有{@link com.rv.nats.annotation.TopicIndex}注解，则会创建{@link TopicIndexParameterResolver}
 */
public class ParameterResolverFactory {

    /**
     * 是否启用缓存
     * 默认为true
     * 如果启用缓存，会将parameter和resolver进行缓存
     * 下次创建时会先从缓存中获取，如果没有则会循环遍历匹配的解析器
     * 如果禁用缓存，每次创建都会循环遍历匹配的解析器
     */
    public static boolean enableCache = true;


    /**
     * 创建参数解析器
     */
    private static final List<ParameterResolver> RESOLVERS = new ArrayList<>();


    /**
     * 缓存参数解析器
     */
    private static final Map<Parameter, ParameterResolver> CACHE = new ConcurrentHashMap<>();

    static {
        RESOLVERS.add(new PrimitiveParameterResolver());
        RESOLVERS.add(new TopicIndexParameterResolver());
        RESOLVERS.add(new PayloadParameterResolver());
    }

    /**
     * 获取参数解析器
     * @param parameter 方法中反射的参数
     */
    public static ParameterResolver get(Parameter parameter) {
        ParameterResolver resolver = null;
        if (enableCache) {
            resolver = CACHE.get(parameter);
        }
        if (resolver != null) {
            return resolver;
        }else {
            for (ParameterResolver r : RESOLVERS) {
                if (r.support(parameter)) {
                    resolver = r;
                    if (enableCache) {
                        CACHE.put(parameter, resolver);
                    }
                    return r;
                }
            }
        }
        return new PayloadParameterResolver();
    }

}
